// ITF14.js
// ITF-14 条码编码器（基于 Interleaved 2 of 5）
// 用于物流包装箱，共 14 位数字

import ITF from './ITF.js';

/**
 * ITF-14 条码类（GS1 包装指示符条码）
 * 规则：
 * - 总长度：14 位
 * - 第1位：包装指示符（1-9）
 * - 后13位：商品编号（不足补前导零）
 * - 最后一位：Mod 10 校验码（权重 3 和 1 交替）
 */
class ITF14 extends ITF {
	/**
	 * 构造函数
	 * @param {string} data - 输入数据（13 或 14 位数字）
	 * @param {Object} options - 配置项
	 */
	constructor(data, options) {
		// 如果输入是 13 位，则自动计算并添加校验位
		if (/^[0-9]{13}$/.test(data)) {
			data += this._calculateChecksum(data);
		}

		super(data, options);
	}

	/**
	 * 验证数据是否有效
	 * 必须是 14 位数字，且最后一位校验正确
	 * @returns {boolean}
	 */
	valid() {
		return (
			/^[0-9]{14}$/.test(this.data) &&
			parseInt(this.data[13], 10) ===
				this._calculateChecksum(this.data.substr(0, 13))
		);
	}

	/**
	 * 计算 Mod 10 校验位（权重 3 和 1 交替）
	 * GS1 标准校验方式（ITF-14, GTIN-14 等）
	 * @private
	 * @param {string} data - 13 位数字字符串
	 * @returns {number} 校验位（0-9）
	 */
	_calculateChecksum(data) {
		// 确保只取前13位，防止意外输入过长
		const digits = data.slice(0, 13);

		let sum = 0;
		for (let i = 0; i < digits.length; i++) {
			const digit = parseInt(digits[i], 10);
			const weight = i % 2 === 0 ? 3 : 1; // 第1位（i=0）权3，第2位（i=1）权1，交替
			sum += digit * weight;
		}

		return (10 - (sum % 10)) % 10;
	}
}

export default ITF14;
